home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / lib / posix / sleep.c < prev    next >
C/C++ Source or Header  |  1990-07-19  |  982b  |  52 lines

  1. /*  sleep(3)
  2.  *
  3.  *  Sleep(n) pauses for 'n' seconds by scheduling an alarm interrupt.
  4.  *
  5.  *  Changed to conform with POSIX      Terrence W. Holm      Oct. 1988
  6.  */
  7.  
  8. #include <lib.h>
  9. #include <signal.h>
  10. #include <unistd.h>
  11.  
  12. PRIVATE void _alfun()
  13. {                /* Used with sleep() below */
  14. }
  15.  
  16. unsigned sleep(secs)
  17. unsigned secs;
  18. {
  19.   unsigned current_secs;
  20.   unsigned remaining_secs;
  21.   void (*old_signal) ();
  22.  
  23.   if (secs == 0) return(0);
  24.  
  25.   current_secs = alarm(0);    /* Is there currently an alarm?  */
  26.  
  27.   if (current_secs == 0 || current_secs > secs) {
  28.     old_signal = signal(SIGALRM, _alfun);
  29.  
  30.     alarm(secs);
  31.     pause();
  32.     remaining_secs = alarm(0);
  33.  
  34.     signal(SIGALRM, old_signal);
  35.  
  36.     if (current_secs > secs)
  37.         alarm(current_secs - (secs - remaining_secs));
  38.  
  39.     return(remaining_secs);
  40.   }
  41.  
  42.   /* Current_secs <= secs,  ie. alarm should occur before secs  */
  43.  
  44.   alarm(current_secs);
  45.   pause();
  46.   remaining_secs = alarm(0);
  47.  
  48.   alarm(remaining_secs);
  49.  
  50.   return(secs - (current_secs - remaining_secs));
  51. }
  52.